package com.atguigu.network;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * 网络通信中服务器端的程序
 */
public class Demo01TCPServer {

    public static void main(String[] args) throws IOException {

        // 1、创建 ServerSocket 对象并绑定 8888 端口
        ServerSocket serverSocket = new ServerSocket(8888);

        // 2、通过 ServerSocket 对象获取 Socket 对象，代表服务器和客户端的一次通信
        // 特别提示：调用 accept() 方法有阻塞效果，如果客户端一直没有发送过来连接，那么当前程序就会一直等待
        System.out.println("服务器端已就绪，等待客户端连接：");
        Socket socket = serverSocket.accept();

        // 3、获取客户端的主机地址等相关信息
        String hostAddress = socket.getInetAddress().getHostAddress();
        System.out.println("已接收到了客户端的连接，客户端主机地址：" + hostAddress);

        // 4、读取客户端发送过来的数据
        // [1]通过 Socket 对象获取输入流
        InputStream inputStream = socket.getInputStream();

        // [2]从输入流中读取数据
        StringBuffer stringBuffer = new StringBuffer();
        int len = 0;
        byte[] bytes = new byte[1024];

        while ((len = inputStream.read(bytes)) != -1) {
            String data = new String(bytes, 0, len);
            stringBuffer.append(data);
        }

        String inputData = stringBuffer.toString();
        System.out.println("inputData = " + inputData);

        // 5、给客户端返回响应的数据
        // [1]通过 Socket 对象获取输出流
        OutputStream outputStream = socket.getOutputStream();

        // [2]把响应数据写入到输出流
        outputStream.write("男人至死是少年[来自服务器端的响应]".getBytes());
        outputStream.flush();

        // 6、关闭资源
        // [1]关闭 Socket 只是关闭本次连接（相当于挂断电话，但是手机还开着）
        socket.close();

        // [2]关闭 ServerSocket 表示服务器关闭（相当于手机关机）
        serverSocket.close();
    }

}
